先看一下源码
|
|
可以看出
func()中有一个长度为32的字符串数组overflow
在调用gets()时由于没有检查字符串长度,导致缓冲区溢出,超过32字节的数据将覆盖内存中的其他数据。
随后比较key和0xcafebabe
main中调用func时参数key指定为0xdeadbeef,在进入func后会落入else分支。
0x01 直接拖进IDA F5反编译func函数
可以看到key的位置在ebp+8h
处
而局部变量overflowme 对应s 首地址在ebp-2ch处。
因此,二者的距离为0x34.
推荐一下win10自带的计算器,对我这个菜鸟还是很好用的zzz
gets()函数并没有对输入的长度进行限制,因此我们可以溢出overflowme数组来改写参数key
改写的值为0xCAFEBABE
EXP:
|
|
这里要注意一下内存中的小端存储,可以使用pwn库中的p32()函数
0x02 用gdb分析
首先需要知道变量overflow和key存储在内存的什么位置,确定缓存区溢出发生的位置。
|
|
现在进入到了gdb的环境中,在main()处下一个断点
|
|
然后运行程序
|
|
现在程序停在了刚才下的断点处
单步调试(ni)至call <funC>
后进入函数(si),一直跟到call <get>
查看一下栈中的情况
|
|
esp中存储的是overflow开始的位置
overflow 开始的位置是0xffffcedc
而key的位置是 0xdeadbeef
0xffffcf10 - 0xffffcedc = 52
其他如上